package bean;

import java.util.List;
import java.util.Set;

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import org.apache.log4j.Logger;

import bean.remote.ConfiguracionRemote;
import bean.remote.MQRemote;
import dominio.Configuracion;
import dominio.MQ;
import dominio.ModuleType;

@Stateless(name = "configuracionBean")
@Remote(value = ConfiguracionRemote.class)
public class ConfiguracionBean implements ConfiguracionRemote {

	private final static Logger logger = Logger
			.getLogger(ConfiguracionBean.class);

	@PersistenceContext(unitName = "webDS")
	private EntityManager em;

	@EJB(beanName = "mqBean")
	private MQRemote mqLocal;

	@Override
	public Configuracion crear(Configuracion configuracion) {
		MQ mq = mqLocal.findByModuleType(configuracion.getModuleType());
		configuracion.setMq(mq);
		em.persist(configuracion);
		logger.trace("Se creo la siguiente configuracion " + configuracion);
		return configuracion;
	}

	@Override
	public Configuracion findByModuleId(Long moduleId) {
		final String sql = "from Configuracion c where c.moduleId=:moduleId";
		Query q = em.createQuery(sql);
		q.setParameter("moduleId", moduleId);
		final Configuracion configuracion = (Configuracion) q.getSingleResult();
		logger.trace("Se encontro la siguiente configuracion " + configuracion);
		return configuracion;
	}

	@Override
	public List<Configuracion> findAll() {
		TypedQuery<Configuracion> query = em.createQuery(
				"from Configuracion c", Configuracion.class);
		logger.trace("Se encontraron todas las configuraciones");
		return (List<Configuracion>) query.getResultList();
	}

	@Override
	public Configuracion findByLogistica() {
		TypedQuery<Configuracion> query = em
				.createQuery(
						"from Configuracion c where c.moduleType=:moduleType and c.activa=:activa",
						Configuracion.class);
		query.setParameter("moduleType", ModuleType.LOGISTICA);
		query.setParameter("activa", 1);
		try {
			Configuracion configuracion = (Configuracion) query
					.getSingleResult();
			logger.trace("Se encontro la siguiente configuracion "
					+ configuracion);
			return configuracion;
		} catch (RuntimeException e) {
			logger.error("No se encontro nada ", e);
			return null;
		}
	}

	@Override
	public void update(Set<Configuracion> configuraciones) {
		for (Configuracion configuracion : configuraciones) {
			em.merge(configuracion);
		}
	}

	@Override
	public List<Configuracion> findAllActives() {
		TypedQuery<Configuracion> query = em.createQuery(
				"from Configuracion c where c.activa=:activa", Configuracion.class);
		query.setParameter("activa", 1);
		logger.trace("Se encontraron todas las configuraciones");
		return query.getResultList();
	}
}
